package com.zzyy.study.service.impl;

import com.zzyy.study.apis.AccountFeignApi;
import com.zzyy.study.apis.StorageFeignApi;
import com.zzyy.study.entities.Order;
import com.zzyy.study.mapper.OrderMapper;
import com.zzyy.study.service.OrderService;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;


/**
 * @auther zzyy
 * @create 2023-12-01 17:53
 * 下订单->减库存->扣余额->改(订单)状态
 */
@Slf4j
@Service
public class OrderServiceImpl implements OrderService
{
    @Resource
    private OrderMapper orderMapper;

    @Resource//订单微服务通过OpenFeign去调用账户微服务
    private AccountFeignApi accountFeignApi;

    //@Resource//订单微服务通过OpenFeign去调用库存微服务，家庭作业
    //private StorageFeignApi storageFeignApi;

    @Override
    //@GlobalTransactional @Transactional //XA
    //@GlobalTransactional(name = "dtx-create-order",rollbackFor = Exception.class) //AT
    @GlobalTransactional //TCC
    public Order create(Order order)
    {
        //xid检查
        String xid = RootContext.getXID();

        //1. 新建订单
        log.info("==================>开始新建订单"+"\t"+"xid_order:" +xid);
        //订单状态status：0：创建中；1：已完结
        order.setStatus(0);
        int result = orderMapper.insertSelective(order);

        //插入订单成功后获得插入mysql的实体对象
        Order orderFromDB = null;

        if(result > 0)
        {
            orderFromDB = orderMapper.selectOne(order);
            log.info("-------> 新建订单成功，orderFromDB info: "+orderFromDB);
            System.out.println();

            //2. 扣减库存------留给粉丝的家庭作业2023.12.10布置，12.17end
            /*log.info("-------> 订单微服务开始调用Storage库存，做扣减count");
            storageFeignApi.decrease(orderFromDB.getProductId(), orderFromDB.getCount());
            log.info("-------> 订单微服务结束调用Storage库存，做扣减完成");
            System.out.println();*/

            //3. 扣减账号余额
            log.info("-------> 订单微服务开始调用Account账号，做扣减money");
            //accountFeignApi.decrease(orderFromDB.getUserId(), orderFromDB.getMoney()); // XA/AT演示

            accountFeignApi.decreaseTcc(orderFromDB.getUserId(),orderFromDB.getMoney()); // TCC演示
            log.info("-------> 订单微服务结束调用Account账号，做扣减完成");
            System.out.println();
            //4. 修改订单状态
            log.info("-------> 修改订单状态。订单状态status：0：创建中；1：已完结");
            orderFromDB.setStatus(1);

            Example whereCondition = new Example(Order.class);
            Example.Criteria criteria = whereCondition.createCriteria();
            criteria.andEqualTo("userId",orderFromDB.getUserId());
            criteria.andEqualTo("status",0);

            int updateResult = orderMapper.updateByExampleSelective(orderFromDB, whereCondition);

            log.info("-------> 修改订单状态完成返回值: "+"\t"+updateResult);
            log.info("-------> orderFromDB info: "+orderFromDB);
        }
        System.out.println();
        log.info("==================>结束新建订单"+"\t"+"xid_order:" +xid);

        return orderFromDB;
    }
}
